#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
高德地图MCP服务 - 连接诊断工具
用于排查连接问题
"""

import sys
import os
import requests
import json

# 添加项目根目录到Python路径
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from cofig.amap_config import AmapConfig


def print_section(title):
    """打印章节标题"""
    print("\n" + "=" * 60)
    print(f"  {title}")
    print("=" * 60)


def test_api_key():
    """测试API Key配置"""
    print_section("1. API Key 配置检查")
    
    if not AmapConfig.AMAP_API_KEY:
        print("❌ API Key未配置")
        return False
    
    print(f"✅ API Key已配置: {AmapConfig.AMAP_API_KEY[:8]}...")
    print(f"   Key长度: {len(AmapConfig.AMAP_API_KEY)} 字符")
    
    if len(AmapConfig.AMAP_API_KEY) < 20:
        print("⚠️  API Key长度可能不正确（通常应该32字符）")
        return False
    
    return True


def test_basic_connectivity():
    """测试基本网络连接"""
    print_section("2. 网络连接测试")
    
    test_urls = [
        "https://restapi.amap.com",  # 高德API基础域名
        "https://mcp.amap.com",      # MCP服务域名（待验证）
    ]
    
    for url in test_urls:
        try:
            print(f"\n测试连接: {url}")
            response = requests.get(url, timeout=5)
            print(f"   ✅ HTTP {response.status_code}")
        except requests.exceptions.Timeout:
            print(f"   ❌ 连接超时")
        except requests.exceptions.ConnectionError:
            print(f"   ❌ 连接失败")
        except Exception as e:
            print(f"   ⚠️  {str(e)}")


def test_traditional_api():
    """测试传统的高德API（验证Key是否有效）"""
    print_section("3. 验证API Key有效性")
    
    # 使用天气查询接口测试（这是普通的REST API）
    url = "https://restapi.amap.com/v3/weather/weatherInfo"
    params = {
        'key': AmapConfig.AMAP_API_KEY,
        'city': '110101',  # 北京东城区
        'extensions': 'base'
    }
    
    try:
        print(f"\n测试URL: {url}")
        print(f"参数: city=110101")
        
        response = requests.get(url, params=params, timeout=10)
        print(f"响应状态: HTTP {response.status_code}")
        
        if response.status_code == 200:
            data = response.json()
            print(f"响应内容: {json.dumps(data, ensure_ascii=False, indent=2)}")
            
            if data.get('status') == '1':
                print("\n✅ API Key有效！普通REST API工作正常")
                return True
            else:
                print(f"\n❌ API错误: {data.get('info')}")
                if data.get('infocode') == '10001':
                    print("   错误原因: API Key无效或过期")
                return False
        else:
            print(f"❌ HTTP错误: {response.status_code}")
            return False
            
    except Exception as e:
        print(f"❌ 请求失败: {str(e)}")
        return False


def test_mcp_endpoints():
    """测试可能的MCP端点"""
    print_section("4. MCP端点探测")
    
    base_urls = [
        "https://mcp.amap.com",
        "https://restapi.amap.com/mcp",
        "https://api.amap.com/mcp",
    ]
    
    endpoints = [
        "/sse",
        "/api/sse",
        "/v1/sse",
        "/mcp/sse",
    ]
    
    print("\n⚠️  注意: 此部分可能需要等待较长时间...\n")
    
    for base_url in base_urls:
        for endpoint in endpoints:
            url = f"{base_url}{endpoint}?key={AmapConfig.AMAP_API_KEY}"
            short_url = f"{base_url}{endpoint}?key=***"
            
            try:
                print(f"尝试: {short_url}")
                
                # 尝试GET
                response = requests.get(url, timeout=5, stream=True)
                print(f"   GET  -> HTTP {response.status_code}")
                
                if response.status_code == 200:
                    print(f"   ✅ 找到有效端点!")
                    # 读取前几行
                    lines = []
                    for i, line in enumerate(response.iter_lines(decode_unicode=True)):
                        if i >= 3:
                            break
                        lines.append(line)
                    print(f"   响应预览: {lines}")
                    return url
                    
            except requests.exceptions.Timeout:
                print(f"   GET  -> 超时")
            except requests.exceptions.ConnectionError:
                print(f"   GET  -> 连接失败")
            except Exception as e:
                print(f"   GET  -> {str(e)[:50]}")
    
    print("\n❌ 未找到有效的MCP端点")
    return None


def show_recommendations():
    """显示建议"""
    print_section("💡 诊断建议")
    
    print("""
可能的问题和解决方案：

1️⃣  MCP服务端点不正确
   • 高德地图的MCP服务可能使用不同的域名或端点
   • 建议: 查看高德官方MCP文档确认正确的端点
   • 文档: https://lbs.amap.com/api/mcp-server/gettingstarted

2️⃣  API Key类型不匹配
   • MCP服务可能需要特定类型的Key（不是普通的Web服务Key）
   • 建议: 在高德控制台检查是否需要申请MCP专用Key
   
3️⃣  服务尚未开放
   • MCP服务可能处于内测阶段，需要申请白名单
   • 建议: 联系高德技术支持确认服务可用性

4️⃣  协议实现差异
   • 高德的MCP实现可能与标准MCP协议有差异
   • 建议: 参考高德提供的官方示例代码

下一步操作：
────────────────────────────────────────────────────────
1. 访问高德开放平台控制台，确认API Key类型和权限
2. 查看高德MCP服务的官方文档和示例代码
3. 如果有技术支持渠道，咨询正确的端点地址
4. 考虑使用传统的REST API作为替代方案
    """)


def test_alternative_approach():
    """测试替代方案 - 直接使用REST API"""
    print_section("5. 替代方案 - 传统REST API")
    
    print("""
如果MCP服务暂时无法使用，可以使用高德的传统REST API：

✅ 天气查询:
   GET https://restapi.amap.com/v3/weather/weatherInfo?key=KEY&city=城市编码

✅ POI搜索:
   GET https://restapi.amap.com/v3/place/text?key=KEY&keywords=关键词

✅ 路线规划:
   GET https://restapi.amap.com/v3/direction/driving?key=KEY&origin=起点&destination=终点

✅ 地理编码:
   GET https://restapi.amap.com/v3/geocode/geo?key=KEY&address=地址

这些API已经验证可用，可以作为临时解决方案。
我可以帮您创建一个使用传统REST API的版本。
    """)


def main():
    """主函数"""
    print("\n" + "🔍" * 30)
    print("  高德地图MCP服务 - 连接诊断工具")
    print("🔍" * 30)
    
    # 测试1: API Key
    if not test_api_key():
        print("\n❌ 请先配置有效的API Key")
        return
    
    # 测试2: 网络连接
    test_basic_connectivity()
    
    # 测试3: 验证Key有效性
    key_valid = test_traditional_api()
    
    if not key_valid:
        print("\n❌ API Key验证失败，请检查Key是否正确")
        return
    
    # 测试4: MCP端点探测
    mcp_endpoint = test_mcp_endpoints()
    
    if mcp_endpoint:
        print(f"\n✅ 成功! 有效的MCP端点: {mcp_endpoint}")
        print("\n请更新 cofig/amap_config.py 中的 AMAP_MCP_BASE_URL")
    else:
        # 显示建议
        show_recommendations()
        
        # 显示替代方案
        test_alternative_approach()
    
    print("\n" + "=" * 60)
    print("  诊断完成")
    print("=" * 60 + "\n")


if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        print("\n\n👋 诊断被用户中断")
    except Exception as e:
        print(f"\n\n❌ 诊断过程出错: {str(e)}")
        import traceback
        traceback.print_exc()

